探索 Python 的 collections
模組
在 Python 中,collections
模組提供了一組高效的資料結構,這些資料結構擴展了內建類別如 list
、dict
的功能,讓我們在處理常見的資料操作時更加方便。以下是這些資料結構的簡單介紹:
namedtuple()
namedtuple()
是一個用來創建具名欄位的 tuple
子類別的工廠函式。它可以讓我們像使用屬性一樣訪問 tuple
中的值,這樣比起一般的 tuple
更具有可讀性。
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(11, 22)
print(p.x, p.y) # 輸出 11, 22
deque
deque
(雙端隊列)是一個類似 list
的容器,它允許在兩端快速地進行元素的添加(append
)與移除(pop
),比起 list
在頭部操作的效率更高。
from collections import deque
d = deque(['a', 'b', 'c'])
d.append('d') # 在尾部添加
d.appendleft('z') # 在頭部添加
print(d) # deque(['z', 'a', 'b', 'c', 'd'])
ChainMap
ChainMap
是一個將多個 dict
物件合併為單一視圖的容器,這在需要同時檢視多個對映(mapping
)時非常實用。
from collections import ChainMap
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
chain = ChainMap(dict1, dict2)
print(chain['b']) # 輸出 2(來自 dict1)
Counter
Counter
是 dict
的子類別,用來統計可雜湊物件的數量。這在需要計算元素出現次數時非常便利,例如統計字串中每個字母出現的頻率。
from collections import Counter
c = Counter('abracadabra')
print(c) # Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
OrderedDict
OrderedDict
是 dict
的子類別,能記錄元素被插入的順序。雖然從 Python 3.7 開始,標準的 dict
也保證了插入順序,但在某些應用中 OrderedDict
仍然有其特定用途。
from collections import OrderedDict
od = OrderedDict()
od['a'] = 1
od['b'] = 2
od['c'] = 3
print(od) # OrderedDict([('a', 1), ('b', 2), ('c', 3)])
defaultdict
defaultdict
是 dict
的子類別,當訪問的鍵不存在時,它會使用一個工廠函數自動提供預設值,避免 KeyError。
from collections import defaultdict
dd = defaultdict(int) # 預設值是 0
dd['a'] += 1
print(dd) # defaultdict(<class 'int'>, {'a': 1})
UserDict
, UserList
, UserString
這三個類別分別是 dict
、list
和 str
的包裝器,目的是簡化自訂類別的過程。它們提供了一個更乾淨的方式來擴展這些基礎類別,適合在需要自定義行為時使用。
接下來,讓我們來看 Leetcode 的第三題——Valid Anagram。這是一道經典的字串問題,要求我們判斷兩個字串是否為字母異位詞(Anagram),也就是兩個字串中的字母及其出現次數完全相同。
給定兩個字串 s
和 t
,如果它們是字母異位詞,則返回 True
,否則返回 False
。
s = "anagram"
t = "nagaram"
# 輸出: True
s = "rat"
t = "car"
# 輸出: False
可以使用 collections.Counter
來統計兩個字串中每個字母出現的次數,然後比較這兩個 Counter
物件是否相等。
如果字母的出現次數完全一致,則它們是異位詞,返回 True
,否則返回 False
。
from collections import Counter
def is_anagram(s: str, t: str) -> bool:
return Counter(s) == Counter(t)
# 測試
print(is_anagram("anagram", "nagaram")) # True
print(is_anagram("rat", "car")) # False
這道題的時間複雜度是 O(n),其中 n
是字串的長度。使用 Counter
可以讓我們很方便地完成這樣的計數任務。
我們還可以藉助 LLM(大型語言模型)來解答一些程式相關的問題。例如,我們可以提問:
Python 有什麼系統函式可以用來「統計兩個字串中每個字母出現的次數」?
以下是 ChatGPT 的回答:
在 Python 中,可以使用 collections.Counter 來統計兩個字串中每個字母出現的次數。Counter 是一個非常方便的資料結構,能夠輕鬆統計可迭代物件(如字串、列表等)中每個元素出現的次數。
今天我們介紹了 Python 的 collections
模組,並且實作了 Leetcode 上的字母異位詞問題。希望這些工具和範例能幫助你在日常開發中處理各種集合和字串操作!敬請期待更多內容!